﻿#include "client.h"
#include "ui_client.h"

client::client(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::client)
{
    ui->setupUi(this);
    setWindowTitle(QStringLiteral("客户端"));

}

client::~client()
{
    delete ui;
}

/*************************************************
  Function:       display
  Description:    将通信套接字socket中接收到的内容显示到tet_write中
  Calls:          无
  Called By:      on_btn_connect_clicked
  Table Accessed: 无
  Table Updated:  无
  Input:          无
  Output:         无
  Return:         void
  Others:         无
*************************************************/
void client::display()
{
    //从通信套接字中取出内容,显示到窗口中
    QByteArray array = socket->readAll();
    ui->tet_read->append(array);
}

/*************************************************
  Function:       on_btn_connect_clicked
  Description:    点击链接按钮，初始化通信套接字，指定父对象，获取lineedit中的ip和port链接
                  服务器，随时将socket中收到的信息显示出来。
  Calls:          无
  Called By:      无
  Table Accessed: 无
  Table Updated:  无
  Input:          无
  Output:         无
  Return:         void
  Others:         无
*************************************************/
void client::on_btn_connect_clicked()
{
    //初始化通信套接字  指定父对象
    socket = new QTcpSocket(this);
    //获取要连接的ip 和 端口
    QString ip = ui->let_ip->text();
    quint16 port = ui->let_port->text().toInt();
    //主动和服务器建立链接
    socket->connectToHost(ip,port);
    ui->tet_read->setText(QStringLiteral("链接成功"));
    //接收对方的消息
    connect(socket , &QTcpSocket::readyRead ,this,&client::display);
}

/*************************************************
  Function:       on_btn_send_clicked
  Description:    点击发送按钮，若socket为空则直接返回，若不为空将tet_write中的内容写
                  入socket发送服务器
  Calls:          无
  Called By:      无
  Table Accessed: 无
  Table Updated:  无
  Input:          无
  Output:         无
  Return:         void
  Others:         无
*************************************************/
void client::on_btn_send_clicked()
{
    if(NULL == socket)
    {
        return;
    }
    //获取textedit中的内容
    QString str = ui->tet_write->toPlainText();
    //将内容写入通信套接字中进行发送,socket只能写入char* 或者byte array
    //用toUtf8()可以将QString转换为字节数组（QByteArray），用.data()可以将字节数组QByteArray转换为 char*格式
    socket->write(str.toUtf8());
}

/*************************************************
  Function:       on_btn_close_clicked
  Description:    点击关闭按钮，若socket为空则显示“没有链接服务器”，若不为空则向客户端发送已
                  断开链接的消息，断开与客户端的链接，并在tet_read中输出“已断开连接”
  Calls:          无
  Called By:      无
  Table Accessed: 无
  Table Updated:  无
  Input:          无
  Output:         无
  Return:         void
  Others:         无
*************************************************/
void client::on_btn_close_clicked()
{
    if(NULL == socket)
    {
        ui->tet_read->setText(QStringLiteral("没有链接服务器"));
        return;
    }
    socket->write(QStringLiteral("对方已断开链接").toUtf8());
    //主动断开连接
    socket->disconnectFromHost();
    socket->close();
    ui->tet_read->append(QStringLiteral("链接已断开"));
}
